package com.nuoyuan.wx.common.utils;

import com.aliyun.oss.ClientConfiguration;
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.common.auth.DefaultCredentialProvider;
import com.aliyun.oss.model.OSSObject;
import com.aliyun.oss.model.ObjectMetadata;
import com.nuoyuan.wx.common.config.OssConfig;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.web.multipart.MultipartFile;

import java.io.*;
import java.util.UUID;

/**
 * @Package com.nuoyuan.wx.common.utils
 * @ClassName OssClientUtil
 * @Description TODO
 * @Author linus
 * @Date 2020-02-16 13:47
 * @Version 1.0
 **/
public class OssClientUtil {

    private static final Logger log = LogManager.getLogger(OssClientUtil.class);

    private OssClientUtil(){}

    /**
     * oss 工具客户端
     */
    private volatile static OSSClient ossClient = null;

    /**
     * 上传文件至阿里云 OSS
     * 文件上传成功,返回文件完整访问路径
     * 文件上传失败,返回 null
     *
     * @param ossConfig oss 配置信息
     * @param file 待上传文件
     * @param fileDir 文件保存目录
     * @return oss 中的相对文件路径
     */
    public static String upload(OssConfig ossConfig, MultipartFile file, String fileDir){
        log.info("upload processing ----" + System.currentTimeMillis());
        initOSS(ossConfig);
        StringBuilder fileUrl = new StringBuilder();
        try {
            String suffix = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf('.'));
            String fileName = System.currentTimeMillis() + "-" + UUID.randomUUID().toString().substring(0,18) + suffix;
            if (!fileDir.endsWith("/")) {
                fileDir = fileDir.concat("/");
            }
            fileUrl = fileUrl.append(fileDir + fileName);

            //创建上传Object的Metadata
            ObjectMetadata metadata = new ObjectMetadata();
            //上传的文件的长度
            metadata.setContentLength(file.getInputStream().available());
            //指定该Object被下载时的网页的缓存行为
            metadata.setCacheControl("no-cache");
            //指定该Object下设置Header
            metadata.setHeader("Pragma", "no-cache");
            //指定该Object被下载时的内容编码格式
            metadata.setContentEncoding("utf-8");
            //文件的MIME，定义文件的类型及网页编码，决定浏览器将以什么形式、什么编码读取文件。如果用户没有指定则根据Key或文件名的扩展名生成，
            //如果没有扩展名则填默认值application/octet-stream
            metadata.setContentType(getcontentType(file.getName()));
            //指定该Object被下载时的名称（指示MINME用户代理如何显示附加的文件，打开或下载，及文件名称）
            metadata.setContentDisposition("filename/filesize=" + file.getName() + "/" + file.getSize() + "Byte.");

            ossClient.putObject(ossConfig.getBucketName(), fileUrl.toString(), file.getInputStream());

            log.info("upload end ----" + System.currentTimeMillis());
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
        fileUrl = fileUrl.insert(0,ossConfig.getUrl());
        String url = fileUrl.toString();
        url = url.replace("nyproduct.oss-cn-hangzhou.aliyuncs.com", "oss.hzhzcr.com");
        return url;
    }

    public static OSSObject getObject(OssConfig ossConfig, String objectName) {
       return ossClient.getObject(ossConfig.getBucketName(), objectName);
    }


    /**
     * 初始化 oss 客户端
     * @param ossConfig
     * @return
     */
    private static OSSClient initOSS(OssConfig ossConfig) {
        if (ossClient == null ) {
            synchronized (OssClientUtil.class) {
                if (ossClient == null) {
                    ossClient = new OSSClient(ossConfig.getEndpoint(),
                            new DefaultCredentialProvider(ossConfig.getAccessKeyId(), ossConfig.getAccessKeySecret()),
                            new ClientConfiguration());
                }
            }
        }
        return ossClient;
    }


    public static String getcontentType(String FilenameExtension) {
        if (FilenameExtension.equalsIgnoreCase(".bmp")) {
            return "image/bmp";
        }
        if (FilenameExtension.equalsIgnoreCase(".gif")) {
            return "image/gif";
        }
        if (FilenameExtension.equalsIgnoreCase(".jpeg") ||
                FilenameExtension.equalsIgnoreCase(".jpg") ||
                FilenameExtension.equalsIgnoreCase(".png")) {
            return "image/jpg";
        }
        if (FilenameExtension.equalsIgnoreCase(".html")) {
            return "text/html";
        }
        if (FilenameExtension.equalsIgnoreCase(".txt")) {
            return "text/plain";
        }
        if (FilenameExtension.equalsIgnoreCase(".vsd")) {
            return "application/vnd.visio";
        }
        if (FilenameExtension.equalsIgnoreCase(".pptx") ||
                FilenameExtension.equalsIgnoreCase(".ppt")) {
            return "application/vnd.ms-powerpoint";
        }
        if (FilenameExtension.equalsIgnoreCase(".docx") ||
                FilenameExtension.equalsIgnoreCase(".doc")) {
            return "application/msword";
        }
        if (FilenameExtension.equalsIgnoreCase(".xml")) {
            return "text/xml";
        }
        return "image/jpg";
    }

    public static void main(String[] args) {
//        String fileUlr = "/Users/linus/Downloads/WechatIMG1315.png";
//        OSSClient ossClient = new OSSClient("oss-cn-hangzhou.aliyuncs.com",
//                new DefaultCredentialProvider("LTAI4Fj9WxAy3xFoM4VwNpjY", "3mhoFO2UXkKcatvtF8nh7N0Msqk7Ap"),
//                new ClientConfiguration());
//
//
//        String resultStr = null;
//        try {
//            File file = new File(fileUlr);
//            //以输入流的形式上传文件
//            InputStream is = new FileInputStream(file);
//            //文件名
//            String fileName = file.getName();
//            //文件大小
//            Long fileSize = file.length();
//            //创建上传Object的Metadata
//            ObjectMetadata metadata = new ObjectMetadata();
//            //上传的文件的长度
//            metadata.setContentLength(is.available());
//            //指定该Object被下载时的网页的缓存行为
//            metadata.setCacheControl("no-cache");
//            //指定该Object下设置Header
//            metadata.setHeader("Pragma", "no-cache");
//            //指定该Object被下载时的内容编码格式
//            metadata.setContentEncoding("utf-8");
//            //文件的MIME，定义文件的类型及网页编码，决定浏览器将以什么形式、什么编码读取文件。如果用户没有指定则根据Key或文件名的扩展名生成，
//            //如果没有扩展名则填默认值application/octet-stream
//            metadata.setContentType(getcontentType(fileName));
//            //指定该Object被下载时的名称（指示MINME用户代理如何显示附加的文件，打开或下载，及文件名称）
//            metadata.setContentDisposition("filename/filesize=" + fileName + "/" + fileSize + "Byte.");
//            //上传文件   (上传文件流的形式)
//            PutObjectResult putResult = ossClient.putObject("nyproduct", "PRODUCT/" + fileName, is, metadata);
//            //解析结果
//            resultStr = putResult.getETag();
//
//            System.out.println(resultStr);
//        } catch (Exception e) {
//            e.printStackTrace();
//        }

        String s = "https://nyproduct.oss-cn-hangzhou.aliyuncs.com/PRODUCT/1583299090935-f7602641-3bbe-49f4.jpg";
        s = s.replace("nyproduct.oss-cn-hangzhou.aliyuncs.com", "oss.hzhzcr.com");
        System.out.println(s);

    }
}